package com.warom.sdg.util;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.util.Log;
import android.widget.ImageView;
import android.widget.Toast;

import com.warom.sdg.ui.GrainActivity;
import com.warom.sdg.ui.GrainActivity.OpenApiCallback;

import java.util.List;

/**
 * 开放平台API使用示例
 * 展示如何使用开放平台API进行各种操作
 */
public class OpenApiExample {
    private static final String TAG = "OpenApiExample";
    
    // 模拟的设备ID和通道号
    private static final String DEMO_DEVICE_ID = "3a131a889160de64ptx9";
    private static final int DEMO_CHANNEL = 0;

    /**
     * 初始化开放平台API
     * @param context 上下文
     * @param appKey 应用Key
     * @param appSecret 应用Secret
     */
    public static void initOpenApi(Context context, String appKey, String appSecret) {
        // 初始化GranaryDeviceManager
        GranaryDeviceManager.getInstance(context).init(appKey, appSecret);
        
        Log.d(TAG, "开放平台API初始化完成");
    }
    
    /**
     * 初始化开放平台API（使用默认配置，从SharedPreferences加载已保存的凭证）
     * @param context 上下文
     */
    public static void initOpenApi(Context context) {
        // 从SharedPreferences加载配置
        OpenApiClient.init(context);
        
        Log.d(TAG, "开放平台API初始化完成（使用已保存配置）");
    }
    
    /**
     * 获取直播流URL
     *
     * @param context  上下文
     * @param deviceId 设备ID
     * @param channel  通道号
     * @param callback 回调接口
     */
    public static void getLiveStreamUrl(final Context context, String deviceId, final int channel, final OpenApiCallback callback) {
        Log.d(TAG, "开始获取设备直播地址: 设备ID=" + deviceId + ", 通道=" + channel);
        
        // 获取设备管理器实例
        GranaryDeviceManager deviceManager = GranaryDeviceManager.getInstance(context);
        
        // 调用获取直播地址API
        deviceManager.getLiveStreamUrl(deviceId, channel, true, 24, new GranaryDeviceManager.LiveStreamCallback() {
            @Override
            public void onSuccess(String liveStreamUrl) {
                Log.d(TAG, "获取直播地址成功: " + liveStreamUrl);
                
                // 如果context是GrainActivity，更新状态
                updateStatus(context, "获取直播地址成功");
                
                // 回调成功
                callback.onSuccess(liveStreamUrl);
            }
            
            @Override
            public void onFailure(Exception e) {
                // 记录详细错误信息
                Log.e(TAG, "获取直播地址失败: " + e.getMessage(), e);
                
                // 获取错误消息
                String errorMsg = e.getMessage();
                String detailedError = "获取直播地址失败";
                
                // 检查是否包含JSON格式的错误信息
                if (errorMsg != null && errorMsg.contains("code") && errorMsg.contains("message")) {
                    try {
                        // 尝试提取错误码和错误消息
                        String code = extractValue(errorMsg, "code");
                        String message = extractValue(errorMsg, "message");
                        
                        // 显示详细的错误信息
                        detailedError = "获取直播地址失败 [" + code + "]: " + message;
                        Log.e(TAG, detailedError);
                    } catch (Exception ex) {
                        // 如果解析失败，显示原始错误消息
                        detailedError = "获取直播地址失败: " + errorMsg;
                    }
                } else {
                    // 显示原始错误消息
                    detailedError = "获取直播地址失败: " + errorMsg;
                }
                
                Toast.makeText(context, detailedError, Toast.LENGTH_LONG).show();
                
                // 如果context是GrainActivity，更新状态
                updateStatus(context, detailedError);
                
                // 回调失败
                callback.onFailure(detailedError);
            }
        });
    }
    
    /**
     * 唤醒设备示例
     * @param context 上下文
     * @param deviceId 设备ID
     * @param channel 通道号
     */
    public static void wakeupDeviceExample(final Context context, String deviceId, int channel) {
        Log.d(TAG, "开始唤醒设备: 设备ID=" + deviceId + ", 通道=" + channel);
        
        // 获取设备管理器实例
        GranaryDeviceManager deviceManager = GranaryDeviceManager.getInstance(context);
        
        // 调用唤醒设备API
        deviceManager.wakeupDevice(deviceId, channel, new GranaryDeviceManager.WakeupCallback() {
            @Override
            public void onSuccess() {
                Log.d(TAG, "设备唤醒成功");
                Toast.makeText(context, "设备唤醒成功", Toast.LENGTH_SHORT).show();
                
                // 如果context是GrainActivity，更新状态
                updateStatus(context, "设备唤醒成功，可以进行后续操作");
            }
            
            @Override
            public void onFailure(Exception e) {
                // 记录详细错误信息
                Log.e(TAG, "设备唤醒失败: " + e.getMessage(), e);
                
                // 获取错误消息
                String errorMsg = e.getMessage();
                String detailedError = "设备唤醒失败";
                
                // 检查是否包含JSON格式的错误信息
                if (errorMsg != null && errorMsg.contains("code") && errorMsg.contains("message")) {
                    try {
                        // 尝试提取错误码和错误消息
                        String code = extractValue(errorMsg, "code");
                        String message = extractValue(errorMsg, "message");
                        
                        // 显示详细的错误信息
                        detailedError = "唤醒设备失败 [" + code + "]: " + message;
                        Log.e(TAG, detailedError);
                        Toast.makeText(context, detailedError, Toast.LENGTH_LONG).show();
                    } catch (Exception ex) {
                        // 如果解析失败，显示原始错误消息
                        detailedError = "设备唤醒失败: " + errorMsg;
                        Toast.makeText(context, detailedError, Toast.LENGTH_LONG).show();
                    }
                } else {
                    // 显示原始错误消息
                    detailedError = "设备唤醒失败: " + errorMsg;
                    Toast.makeText(context, detailedError, Toast.LENGTH_LONG).show();
                }
                
                // 如果context是GrainActivity，更新状态
                updateStatus(context, detailedError);
            }
        });
    }
    
    /**
     * 从JSON字符串中提取指定键的值
     * @param jsonString JSON字符串
     * @param key 要提取的键
     * @return 提取的值
     */
    private static String extractValue(String jsonString, String key) {
        int keyIndex = jsonString.indexOf("\"" + key + "\":");
        if (keyIndex == -1) {
            return "";
        }
        
        int valueStart = jsonString.indexOf(":", keyIndex) + 1;
        int valueEnd;
        
        // 检查值是否是字符串
        if (jsonString.charAt(valueStart) == ' ') {
            valueStart++; // 跳过空格
        }
        
        if (jsonString.charAt(valueStart) == '"') {
            // 字符串值
            valueStart++; // 跳过开始的引号
            valueEnd = jsonString.indexOf("\"", valueStart);
        } else {
            // 数字或其他值
            valueEnd = jsonString.indexOf(",", valueStart);
            if (valueEnd == -1) {
                valueEnd = jsonString.indexOf("}", valueStart);
            }
        }
        
        return jsonString.substring(valueStart, valueEnd);
    }

    /**
     * 获取设备截图示例
     * @param context 上下文
     * @param deviceId 设备ID
     * @param channel 通道号
     * @param imageView 显示截图的ImageView
     */
    public static void getDeviceScreenshotExample(final Context context, String deviceId, int channel, final ImageView imageView) {
        Log.d(TAG, "开始获取设备截图: 设备ID=" + deviceId + ", 通道=" + channel);
        
        // 获取设备管理器实例
        GranaryDeviceManager deviceManager = GranaryDeviceManager.getInstance(context);
        
        // 调用获取设备截图API，启用害虫识别
        deviceManager.getDeviceScreenshot(deviceId, channel, true, new GranaryDeviceManager.ScreenshotCallback() {
            @Override
            public void onSuccess(Bitmap originalImage, Bitmap annotatedImage, List<PestDetectionHelper.PestDetectionResult> pestResults) {
                Log.d(TAG, "获取设备截图成功");
                
                // 显示标注后的图像
                if (imageView != null) {
                    imageView.setImageBitmap(annotatedImage);
                }
                
                String message;
                // 显示检测到的害虫信息
                if (pestResults != null && !pestResults.isEmpty()) {
                    StringBuilder sb = new StringBuilder("检测到害虫:\n");
                    for (PestDetectionHelper.PestDetectionResult result : pestResults) {
                        sb.append(result.pestTypeName)
                          .append(", 置信度: ")
                          .append(String.format("%.1f%%", result.confidence * 100))
                          .append("\n");
                    }
                    message = sb.toString();
                    Log.d(TAG, message);
                    Toast.makeText(context, message, Toast.LENGTH_LONG).show();
                } else {
                    message = "未检测到害虫";
                    Log.d(TAG, message);
                    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
                }

                // 如果context是GrainActivity，更新状态
                updateStatus(context, "获取设备截图成功：" + message);
            }
            
            @Override
            public void onFailure(Exception e) {
                // 记录详细错误信息
                Log.e(TAG, "获取设备截图失败: " + e.getMessage(), e);
                
                // 获取错误消息
                String errorMsg = e.getMessage();
                String detailedError = "获取设备截图失败";
                
                // 检查是否包含JSON格式的错误信息
                if (errorMsg != null && errorMsg.contains("code") && errorMsg.contains("message")) {
                    try {
                        // 尝试提取错误码和错误消息
                        String code = extractValue(errorMsg, "code");
                        String message = extractValue(errorMsg, "message");
                        
                        // 显示详细的错误信息
                        detailedError = "获取设备截图失败 [" + code + "]: " + message;
                        Log.e(TAG, detailedError);
                        Toast.makeText(context, detailedError, Toast.LENGTH_LONG).show();
                    } catch (Exception ex) {
                        // 如果解析失败，显示原始错误消息
                        detailedError = "获取设备截图失败: " + errorMsg;
                        Toast.makeText(context, detailedError, Toast.LENGTH_LONG).show();
                    }
                } else {
                    // 显示原始错误消息
                    detailedError = "获取设备截图失败: " + errorMsg;
                    Toast.makeText(context, detailedError, Toast.LENGTH_LONG).show();
                }
                
                // 如果context是GrainActivity，更新状态
                updateStatus(context, detailedError);
            }
        });
    }
    
    /**
     * 更新状态文本
     *
     * @param context 上下文
     * @param status  状态信息
     */
    private static void updateStatus(Context context, final String status) {
        if (context instanceof GrainActivity) {
            ((GrainActivity) context).updateStatus(status);
        }
    }
} 